Abhängige Suchhilfe

Immer wieder ein Thema in Selektionsbildschirmen oder Dynpros: Abhängig vom Feldwert eines anderen Feldes die Suchhilfe für die angeforderte Suchhilfe einschränken.

Die wirklich einfachste Möglichkeit ist die über die Verknüpfung der Felder in einer Struktur: Feldabhängige Selektion

Manchmal reicht das jedoch nicht aus oder man möchte anhand anderer Feldwerte unterschiedliche Suchhilfen aufrufen. Das folgende Coding zeigt die Möglichkeit mit Hilfe der Funktionsbausteine DYNP_VALUES_READ und DYNP_VALUES_UPDATE.

Feldübertragung / PAI – PBO

Eine kurze Info, warum mit den genannten Bausteinen gearbeitet werden muss: Ein Dynpro ist ein eigenes Objekt. Es können zwar Feldnamen (Variablen) aus dem ABAP-Programm verwendet werden, aber diese sind erst einmal unabhängig vom Dynpro. Ebenso können im Dynpro Felder definiert werden, die im ABAP-Programm nicht bekannt sind.

Die Übertragung der Feldwerte erfolgt über Namensgleichheit.

Ein Dynpro wird im PBO – Process Before Output initialisiert. Hier können Feldattribute (Sichtbar, eingabebereit, …) gesetzt werden. Der GUI-Status und GUI-Titel können gesetzt bzw. geändert werden. Felder können befüllt werden bzw. werden aus dem ABAP-Programm übernommen.

Danach wird das Dynpro mit den Feldern, Feldwerten und Feldattributen angezeigt.

Bei Tastendruck wird das PAI – Process After Input ausgeführt. Hier werden geänderte Feldwerte in die ABAP-Variablen, nach Prüfung auf Richtigkeit (Datum, Festwerte etc), übernommen. Der OK-Code kann ausgewertet werden.

Es gibt drei Ausnahmen von dieser Logik:

  • F1-Hilfe: Die Taste F1 wird ausgeführt, ohne dass der PAI angestoßen wird.
  • F4-Wertehilfe: Auch die F4-Hilfe bewirkt keinen PAI. Das bedeutet, dass ein soeben eingegebener Wert in ein Eingabe bereites Feld nicht in die entsprechende ABAP-Variable übernommen wird!
  • Exit-Kommandos: Funktionen, die im GUI-Status als “Exit-Funktion” gekennzeichnet sind bewirken zwar einen PAI, jedoch ohne dass Feldprüfungen statt finden oder Feldwerte übernommen werden

F4-Falle

Diese Besonderheiten muss man wissen, um zu verstehen, warum bei einer F4-Hilfe die Datenübertragung zwischen Dynpro und ABAP-Programm nachprogrammiert werden muss. Wenn du im Dynpro in FELD1 einen Wert eingibst und dann, ohne eine Funktionstaste zu drücken (ENTER, F2, F3, etc.) und mit dem Cursor in das FELD2 springst, dann ist der Wert aus FELD1 noch nicht im ABAP-Programm bekannt! Wenn du nun in FELD2 die F4-Werthilfe betätigst, weiß das ABAP-Programm nichts von dem soeben eingegebenen Wert in FELD1. Der Wert muss erst mit DYNP_VALUES_READ ermittelt werden.

Änderst du den Wert für FELD2, also das Feld für das du die Werthilfe aufgerufen hast, dann kannst du im ABAP-Programm dieses Feld einfach füllen. Der Transport zum Dynpro erfolgt automatisch. Wenn du allerdings ein anderes Feld ändern möchtest, dann musst du DYNP_VALUES_UPDATE verwenden.

Beispielprogramm

Das Beispielprogramm demonstriert die Verwendung von DYNP_VALUES_GET und DYNP_VALUES_UPDATE. Bei F4 im Feld P_EINS werden Werte gesetzt. Bei F4 im Feld P_ZWEI wird abhängig von P_EINS ein anderer Wert gesetzt.

Code

REPORT.

PARAMETERS p_eins TYPE char10.
PARAMETERS p_zwei TYPE char10.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_eins.
  PERFORM eins.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_zwei.
  PERFORM zwei.

FORM eins.

  DATA lt_fields TYPE STANDARD TABLE OF dynpread.
  DATA ls_field  TYPE dynpread.

  p_eins = 'Z'.
  p_zwei = '999'.

  ls_field-fieldname  = 'P_ZWEI'.
  ls_field-fieldvalue = p_zwei.
  APPEND ls_field TO lt_fields.

  CALL FUNCTION 'DYNP_VALUES_UPDATE'
    EXPORTING
      dyname     = sy-cprog
      dynumb     = sy-dynnr
    TABLES
      dynpfields = lt_fields
    EXCEPTIONS
      OTHERS     = 8.
  IF sy-subrc = 0.
    MESSAGE 'Feldwert gesetzt' TYPE 'S'.
  ENDIF.
ENDFORM.

FORM zwei.

  DATA lt_fields TYPE STANDARD TABLE OF dynpread.
  DATA ls_field  TYPE dynpread.

  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname                   = sy-repid
      dynumb                   = sy-dynnr
      translate_to_upper       = 'X'
      request                  = 'A'
      perform_conversion_exits = 'X'
    TABLES
      dynpfields               = lt_fields
    EXCEPTIONS
      OTHERS                   = 11.

  READ TABLE lt_fields INTO ls_field WITH KEY fieldname = 'P_EINS'.
  IF sy-subrc = 0.
    p_eins = ls_field-fieldvalue.
  ENDIF.

  CASE p_eins.
    WHEN 'A'.
      p_zwei = '1'.
    WHEN 'B'.
      p_zwei = '2'.
    WHEN 'C'.
      p_zwei = '3'.
  ENDCASE.

ENDFORM.

 

Enno Wulff